package main

import (
	"net/http"
	"math/rand"
	"image/gif"
	"image"
	"math"
	"image/color"
	"log"
)

var palette = []color.Color{color.White, color.Black}

const (
	whiteIndex = 0
	blackIndex = 1
)

func main()  {
	http.HandleFunc("/l", lissajous)
	log.Fatal(http.ListenAndServe("localhost:8000", nil))
}

func lissajous(out http.ResponseWriter, r *http.Request)  {
	const (
	cycles  = 5
	res     = 0.001
	size    = 100
	nframes = 64
	delay   = 8
	)

	freq := rand.Float64()
	anim := gif.GIF{LoopCount: nframes}
	phase := 0.0
	for i := 0; i < nframes; i++ {
	rect := image.Rect(0, 0, size*2+1, size*2+1)
	img := image.NewPaletted(rect, palette)
	for t := 0.0; t < cycles*2*math.Pi; t += res {
	x := math.Sin(t)
	y := math.Sin(t*freq + phase)
	img.SetColorIndex(size+int(size*x+0.5), size+int(size*y+0.5), blackIndex)
	}
	phase += 0.1
	anim.Delay = append(anim.Delay, delay)
	anim.Image = append(anim.Image, img)
	}
	gif.EncodeAll(out, &anim)
}